'''
五位哲学家围坐在一张桌子前，每个人 面前有一碗饭和一只筷子。在这里每个哲学家可以看做是一个独立的线程，
而每只筷子可以看做是一个锁。每个哲学家可以处在静坐、 思考、吃饭三种状态中的一个。需要注意的是，
每个哲学家吃饭是需要两只筷子的，这样问题就来了：如果每个哲学家都拿起自己左边的筷子， 
那么他们五个都只能拿着一只筷子坐在那儿，直到饿死。
'''

import threading
from p05_locking_with_deadlock_avoidance import acquire
import time

# The philosopher thread
def philosopher(no, left, right):
    while True:
        with acquire(left,right):
             print(no, ' eating')
             time.sleep(2)

# The chopsticks (represented by locks)
NSTICKS = 5
chopsticks = [threading.Lock() for n in range(NSTICKS)]

# Create all of the philosophers
for n in range(NSTICKS):
    t = threading.Thread(target=philosopher,
                         args=(n, chopsticks[n],chopsticks[(n+1) % NSTICKS]))
    t.start()


time.sleep(1)    